import { showDialog } from 'vant';
import { connectWallet, checkIfMetaMaskInstalled } from './web3';
import authService from './auth';

/**
 * Web3钱包拦截器
 * 用于检查钱包连接状态，并在需要时提示用户连接或安装MetaMask钱包
 */
class Web3Interceptor {
  constructor() {
    this.isPrompting = false; // 防止多次弹窗
    this.lastPromptTime = 0; // 上次弹窗时间，防止频繁弹窗
    this.setupAccountChangeListener(); // 设置账户变化监听器
  }

  /**
   * 设置账户变化监听器
   */
  setupAccountChangeListener() {
    if (window.ethereum) {
      // 监听账户变化
      window.ethereum.on('accountsChanged', (accounts) => {
        this.handleAccountsChanged(accounts);
      });
    }
  }

  /**
   * 处理账户变化
   * @param {Array} accounts 账户列表
   */
  async handleAccountsChanged(accounts) {
    // 如果没有账户，表示用户断开了连接
    if (accounts.length === 0) {
      if (authService.isAuthenticated()) {
        authService.logout();
      }
      return;
    }

    // 获取新账户
    const newAccount = accounts[0];
    
    // 如果用户已登录，检查账户是否变化
    if (authService.isAuthenticated()) {
      const userInfo = authService.getUserInfo();
      
      // 如果账户变化，清除登录状态并提示重新登录
      if (userInfo && userInfo.address !== newAccount) {
        // 清除登录状态
        //authService.logout();
        
        // 显示提示
        if (!this.isPrompting) {
          this.isPrompting = true;
          
          try {
            const action = await showDialog({
              title: '账户已切换',
              message: '检测到您切换了钱包账户，需要重新登录。是否立即登录？',
              confirmButtonText: '立即登录',
              cancelButtonText: '稍后登录',
              showCancelButton: true
            });
            
            if (action === 'confirm') {
              // 用户选择立即登录
              await this.tryLogin();
            }
          } finally {
            this.isPrompting = false;
          }
        }
      }
    }
  }

  /**
   * 检查钱包连接状态
   * @returns {Promise<boolean>} 是否已连接钱包
   */
  async checkWalletConnection() {
    // 如果已经在显示弹窗，或者距离上次弹窗不到3秒，则不再弹窗
    const now = Date.now();
    if (this.isPrompting || (now - this.lastPromptTime < 3000)) {
      return false;
    }

    // 检查是否安装了MetaMask
    if (!checkIfMetaMaskInstalled()) {
      this.isPrompting = true;
      this.lastPromptTime = now;
      
      // 显示安装MetaMask的提示
      try {
        const action = await showDialog({
          title: '未检测到钱包',
          message: '您需要安装MetaMask钱包来使用完整功能。',
          confirmButtonText: '安装钱包',
          cancelButtonText: '重试连接',
          showCancelButton: true
        });
        
        if (action === 'confirm') {
          // 打开MetaMask安装页面
          window.open('https://metamask.io/download.html', '_blank');
        } else {
          // 用户选择重试，再次检查
          setTimeout(() => {
            this.checkWalletConnection();
          }, 1000);
        }
      } finally {
        this.isPrompting = false;
      }
      
      return false;
    }

    // 尝试连接钱包
    try {
      const account = await connectWallet();
      if (account) {
        // 钱包连接成功，尝试登录
        await this.tryLogin();
        return true;
      }
      return false;
    } catch (error) {
      // 连接失败，显示提示
      this.isPrompting = true;
      this.lastPromptTime = now;
      
      try {
        const action = await showDialog({
          title: '钱包连接失败',
          message: '无法连接到MetaMask钱包，请确保您已登录MetaMask并授权连接。',
          confirmButtonText: '重试连接',
          cancelButtonText: '安装钱包',
          showCancelButton: true
        });
        
        if (action === 'confirm') {
          // 用户选择重试连接
          setTimeout(() => {
            this.checkWalletConnection();
          }, 1000);
        } else {
          // 打开MetaMask安装页面
          window.open('https://metamask.io/download.html', '_blank');
        }
      } finally {
        this.isPrompting = false;
      }
      
      return false;
    }
  }

  /**
   * 尝试用户登录
   * @param {number} sessionDuration 会话持续时间（小时），默认24小时
   * @returns {Promise<boolean>} 是否登录成功
   */
  async tryLogin(sessionDuration = 24) {
   
    // 如果用户已经登录，不需要再次登录
    if (authService.isAuthenticated()) {
      return true;
    }
   
  
    // 如果已经在显示弹窗，不再弹窗
    if (this.isPrompting) {
      return false;
    }
    

    this.isPrompting = true;
    
    try {
      const action = await showDialog({
        title: '授权登录',
        message: '请签名以完成登录验证',
        confirmButtonText: '确认登录',
        cancelButtonText: '暂不登录',
        showCancelButton: true
      });
      
      if (action === 'confirm') {
        // 用户选择登录，设置会话持续时间（小时转毫秒）
        return await authService.login(sessionDuration * 60 * 60 * 1000);
      }
      
      return false;
    } catch (error) {
      console.error('登录失败:', error);
      return false;
    } finally {
      this.isPrompting = false;
    }
  }
}

// 创建单例实例
const web3Interceptor = new Web3Interceptor();

export default web3Interceptor;